<?php

namespace App\System\Base\Services;

use App\System\Cis\Repositories\CisUserRepository;
use App\System\Fina\Repositories\FinaIntegralRegRecordRepository;
use App\System\Log\Repositories\LogPayRepository;
use App\System\Order\Repositories\OrderInfoRepository;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class NotifyService extends Service
{

    /**
     * 订单回调业务更新总入口
     * @param $out_trade_no 支付流水号(如果不是第三方则是订单ID)
     * @param $pay_type 1微信 2支付宝 3钱包
     * @param $transaction_id 第三方流水号
     * @return bool
     */
    public static function orderNotify($out_trade_no , $pay_type , $transaction_id=0)
    {
       // Log::info('支付状态：成功'.$out_trade_no.'-----'.$transaction_id);
        $type = 1;//支付业务类型：1充值 2订单
        $order_id = 0;
        //$cash = 0;
        if($pay_type<3) DB::beginTransaction();//第三方支付才开启事务,余额支付在支付已开启事务故此处不能开启
        $log = LogPayRepository::getInstance();
        $order = OrderInfoRepository::getInstance();
        $fina = FinaIntegralRegRecordRepository::getInstance();
        $user = CisUserRepository::getInstance();
        if($pay_type < 3)
        {
            $log_info = $log->getOne($out_trade_no);
            $msg = isset($log_info->id) ? '数组存在$log_info->id' : '数据不存在';
            Log::info('支付更新状态：成功'.$out_trade_no.'.....'.$msg);
            if(!$log_info) return false;
            $cash = $log_info->cash;
            $res = $log->updateLogPay(['status'=>1],$log_info->id);//更新支付记录

            if(!$res) return false;
            $fina_info = $fina_info = $fina->getOneByPayId($log_info->id);
            if(!$fina_info) return false;

            $set = ['status'=>1];
            if($fina_info->order_id)
            {//有订单ID表示订单支付
                $user_info = $user->getUser($fina_info->user_id);
                if($user_info) $set['after_cash'] = $user_info->integral;//交易后金额
                $type = 2;
                $order_id = $fina_info->order_id;
            }
            else
            {//充值业务更新用户钱包
                $res = $user->updateUserPurse($fina_info->user_id,1,'integral',$cash);//更新用户钱
                if(!$res)
                {
                    return false;
                }
                $user_info = $user->getUser($fina_info->user_id);
                if($user_info) $set['after_cash'] = $user_info->integral;//交易后金额
            }

            $res = $fina->customUpdate($set,['field'=>'pay_id','value'=>$log_info->id]);//更新财务记录
            if(!$res) return false;

        }
        else
        {//订单积分支付
            $fina_info = $fina->getOneByOrderId($out_trade_no,3,2);//查询积分支付订单记录
            if(!$fina_info)
            {//支付金额为0，没有财务记录
                $order_id = $out_trade_no;
            }
            else
            {
                $user_info = $user->getUser($fina_info->user_id);
                $order_id = $fina_info->order_id;
               // $cash = $fina_info->cash;
                $res = $fina->updateFina(['status'=>1,'after_cash'=>$user_info->integral],$fina_info->id);//更新财务记录
                $fina_info = $fina->getOneByOrderId($out_trade_no,3,1);//查询是否有第三方充值的记录的，有的话要更新为失败
                if($fina_info)
                {
                    $fina->updateFina(['status'=>2],$fina_info->id);//更新财务记录
                    $log->updateLogPay(['status'=>2],$fina_info->pay_id);//更新支付记录为失败
                }
            }
            if(!$res) return false;
            $type = 2;//设为订单支付
        }
        if($type == 2)
        {//订单支付
            //$order_info = $order->getOneOrder($order_id);
            $res = $order->update(['status'=>2,'pay_time'=>date("Y-m-d H:i:s")],$order_id);//更新订单状态为已支付
            if(!$res) return false;
        }

        if($pay_type<3) DB::commit();

        return true;
    }
}